package queues;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import javax.swing.JTextArea;
import model.Client;
public class Simulation {
private List<SimulationQueue> queues = new ArrayList<>();
private SimulationInput simulationInput;
public Simulation(SimulationInput simulationInput, JTextArea textArea) {
this.simulationInput = simulationInput;
List<Client> clients = new ArrayList<>();
for (int i = 0; i < simulationInput.getNrClientsField(); i++) {
Client current = new Client("Client" + i);
current.setServiceTime(Math.round(ThreadLocalRandom.current().nextInt(simulationInput.getServiceMinField(),
simulationInput.getServiceMaxField() + 1) / 1000));
current.setArrivalTime(generateHour() + Math.round(ThreadLocalRandom.current()
.nextInt(simulationInput.getArrivalMinField(), simulationInput.getArrivalMaxField() + 1)) * 60);
clients.add(current);
}
for (int i = 0; i < simulationInput.getNrQueuesField(); i++) {
queues.add(new SimulationQueue(i, textArea));
}
Collections.sort(clients, new Comparator<Client>() {
@Override
public int compare(Client o1, Client o2) {
return Long.compare(o1.getArrivalTime(), o2.getArrivalTime());
}
});
for (Client client : clients) {
// here we should filter hours
getMinQueue().addClient(client);
}
for (SimulationQueue sq : queues) {
new Thread(sq).start();
}
}
private long generateHour() {
int hour = ThreadLocalRandom.current().nextInt(simulationInput.getHoursFieldMin(),
simulationInput.getHoursFieldMax() + 1);
int minute = ThreadLocalRandom.current().nextInt(0, 61);
SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy hh:mm:ss");
Date d = null;
try {
d = sdf.parse("15/04/2016 " + hour + ":" + minute + ":00");
} catch (ParseException e) {
e.printStackTrace();
}
return d.getTime();
}
private SimulationQueue getMinQueue() {
Collections.sort(queues, new Comparator<SimulationQueue>() {
@Override
public int compare(SimulationQueue sq1, SimulationQueue sq2) {
return Long.compare(sq1.getWatingTime(), sq2.getWatingTime());
}
});
return queues.get(0);
}
}